/*
 * Copyright (C) 2012 Caldia Apps.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.caldia.android.frameworkG1.controller;

import java.util.Set;

import org.caldia.android.frameworkG1.activity.AbstractActivity;
import org.caldia.android.frameworkG1.application.Application;
import org.caldia.android.frameworkG1.application.MessagingController;
import org.caldia.android.frameworkG1.fragment.TopFragment;
import org.caldia.android.frameworkG1.preference.MyPreference;

import android.app.Activity;
import android.support.v4.app.Fragment;

/**
 * コントローラに実装すべきメソッドを定義する
 * 
 * @author k-matsuda@caldia.org
 * 
 */
public interface IActivityManager {

	/**
	 * アクティビティ番号を取得する
	 * 
	 * @param cls
	 *            取得対象アクティビティクラス
	 * @param logNo
	 *            トラッキング用番号
	 * @return アクティビティ番号
	 */
	int getActivityNo(final Class<? extends Activity> cls, final int logNo);

	/**
	 * フラグメント番号を取得する
	 * 
	 * @param cls
	 *            取得対象フラグメントクラス
	 * @param logNo
	 *            トラッキング用番号
	 * @return フラグメント番号
	 */
	int getFragmentNo(final Class<? extends Fragment> cls, final int logNo);

	/**
	 * 次に表示するフラグメント番号を取得する
	 * 
	 * @param currentNo
	 *            現在表示中のアクティビティ、フラグメント番号
	 * @param logNo
	 *            トラッキング用番号
	 * @return 次に表示するフラグメントが無い場合は -1 を返す
	 */
	int getNextFragmentNo(final int currentNo, final int logNo);

	/**
	 * 戻り先フラグメント番号を取得する
	 * 
	 * @param currentNo
	 *            現在表示中のアクティビティ、フラグメント番号
	 * @param logNo
	 *            トラッキング用番号
	 * @return 戻り先フラグメントが無い場合は -1 を返す
	 */
	int getPreviousFragmentNo(final int currentNo, final int logNo);

	/**
	 * モードを設定する
	 * 
	 * @param modeNo
	 *            モード番号
	 */
	void setMode(final int modeNo, final int logNo);

	/**
	 * 設定中のモード番号を取得する
	 * 
	 * @param logNo
	 *            トラッキング用番号
	 * @return モード番号
	 */
	int getMode(final int logNo);

	/**
	 * アクティビティに番号をつける
	 * 
	 * @param activityNo
	 *            アクティビティ番号
	 * @param cls
	 *            アクティビティクラス
	 * @param logNo
	 *            トラッキング用番号
	 */
	void addActivity(final int activityNo, final Class<? extends Activity> cls,
			final int logNo);

	/**
	 * フラグメントに番号をつける
	 * 
	 * @param fragmentNo
	 *            フラグメント番号
	 * @param cls
	 *            フラグメントクラス
	 * @param logNo
	 *            トラッキング用番号
	 */
	void addFragment(final int fragmentNo, final Class<? extends Fragment> cls,
			final int logNo);

	/**
	 * 次に表示する画面番号を取得する
	 * 
	 * @param currentNo
	 *            表示中のアクティビティ、フラグメント番号
	 * @param logNo
	 *            トラッキング用番号
	 * @return 次に表示する画面が無い場合は -1 を返す
	 */
	int getNextActivityNo(final int currentNo, final int logNo);

	/**
	 * 戻り先画面番号を取得する
	 * 
	 * @param currentNo
	 *            表示中のアクティビティ、フラグメント番号
	 * @param logNo
	 *            トラッキング用番号
	 * @return 戻り先画面が無い場合は -1 を返す
	 */
	int getPreviousNo(final int currentNo, final int logNo);

	/**
	 * モードを開始する
	 * 
	 * @param mode
	 *            モード
	 * @param l
	 *            リスナー
	 * @param logNo
	 *            トラッキング用番号
	 */
	void startMode(final int mode, final ControllerListener l, final int logNo);

	/**
	 * モード開始時に表示するアクティビティ、フラグメント番号を設定する
	 * 
	 * @param mode
	 *            モード番号
	 * @param no
	 *            アクティビティ、フラグメント番号
	 * @param logNo
	 *            トラッキング用番号
	 */
	// public void setModeStartNo(final int mode, final int no, final int
	// logNo);

	/**
	 * 画面を起動する
	 * 
	 * @param activityNo
	 *            アクティビティ番号
	 * @param l
	 *            リスナー
	 * @param logNo
	 *            トラッキング用番号
	 */
	void startActivity(final int activityNo, final ControllerListener l,
			final int logNo);

	/**
	 * フラグメントを取得する
	 * 
	 * @param fragmentNo
	 *            フラグメント番号
	 * @param logNo
	 *            トラッキング用番号
	 * @return フラグメント
	 */
	TopFragment getFragment(final int fragmentNo, final int logNo);

	/**
	 * フラグメントをトップ画面として表示する場合に使用するアクティビティを設定する
	 * 
	 * @param activity
	 *            アクティビティクラス
	 * @param logNo
	 *            トラッキング用番号
	 */
	void setFragmentActivity(final Class<? extends AbstractActivity> activity,
			final int logNo);

	/**
	 * フラグメントをトップ画面として表示する場合に使用するアクティビティのクラス名を取得
	 * 
	 * @param logNo
	 *            トラッキング用番号
	 * @return アクティビティクラス名
	 */
	String getFragmentActivityName(final int logNo);

	/**
	 * メッセージングコントローラインスタンス取得
	 * 
	 * @param logNo
	 *            トラッキング用番号
	 * @return メッセージングコントローラ
	 */
	MessagingController getMessagingController(final int logNo);

	/**
	 * プリファレンスインスタンス取得
	 * 
	 * @param logNo
	 *            トラッキング用番号
	 * @return プリファレンス
	 */
	MyPreference getPreference(final int logNo);

	/**
	 * アクティビティ名を取得する
	 * 
	 * @param activityNo
	 *            アクティビティ番号
	 * @param logNo
	 *            トラッキング用番号
	 * @return アクティビティが登録されていなければnullを返す
	 */
	String getActivityName(final int activityNo, final int logNo);

	/**
	 * フラグメント名を取得する
	 * 
	 * @param fragmentNo
	 *            フラグメント番号
	 * @param logNo
	 *            トラッキング用番号
	 * @return フラグメントが登録されていなければ null を返す
	 */
	String getFragmentName(final int fragmentNo, final int logNo);

	/**
	 * アプリケーションを取得する
	 * 
	 * @param logNo
	 *            トラッキング用番号
	 * @return アプリケーション
	 */
	Application getApplication(final int logNo);

	/**
	 * 登録済みメッセージングリスナーセットを取得
	 * 
	 * @return メッセージングリスナーセット
	 */
	Set<ControllerListener> getMessagingListeners(final int logNo);

	/**
	 * 登録済みメッセージングリスナーセットにリスナーを追加したものを取得
	 * 
	 * @param l
	 *            追加するメッセージングリスナー
	 * @param logNo
	 *            トラッキング用番号
	 * @return メッセージングリスナーセット
	 */
	Set<ControllerListener> getMessagingListeners(final ControllerListener l,
			final int logNo);

	/**
	 * メッセージングリスナーを追加する
	 * 
	 * @param listener
	 *            メッセージングリスナー
	 */
	void addMessagingListener(final ControllerListener listener);

	/**
	 * メッセージングリスナーを削除する
	 * 
	 * @param l
	 *            削除するメッセージングリスナーインスタンス
	 */
	void removeMessagingListener(final ControllerListener l);

	/**
	 * アクティビティ、フラグメント番号を取得する
	 * 
	 * @param obj
	 *            取得対象
	 * @return 番号
	 */
	int getNo(Object obj);

}
